package com.yupi.yupicturebackend.manager.sharding;

import org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
import org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Properties;

/**
 * 图片分表算法
 */
public class PictureShardingAlgorithm implements StandardShardingAlgorithm<Long> {

    /**
     *
     * @param availableTargetNames   所有支持的分表名称
     * @param preciseShardingValue   实际值就是配置文件里配置的spaceId
     * @return
     */
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> preciseShardingValue) {
        Long spaceId = preciseShardingValue.getValue();
        // 拿到逻辑表picture
        String logicTableName = preciseShardingValue.getLogicTableName();
        // spaceId 为 null 表示查询所有图片
        if (spaceId == null) {
            return logicTableName;
        }
        // 根据 spaceId 动态生成分表名
        String realTableName = "picture_" + spaceId;
        /**
         * 如果存在该分表，则返回该分表名，否则返回逻辑表名（让它自己在所有表里挨个找 看有没有就对了，典型的就是 某个地方找不到对应的东西，那我就翻箱底去找）
         * 总之就是只要返回逻辑表名 那么ShardingSphere 会查询 actual-data-nodes 中配置的所有物理表（即所有 picture 和 picture_{spaceId} 表
         */
        if (availableTargetNames.contains(realTableName)) {
            return realTableName;
        } else {
            return logicTableName;
        }
        /**
         * 目前存在的问题是availableTargetNames是逻辑表名（原始表名），来源与配置文件处的 actual-data-nodes: picture.picture  # 动态分表
         * ，而不是物理表名，那么就无法通过 availableTargetNames.contains(realTableName)判断分表是否存在
         * 既然需要具体的物理表，那么就自己去想办法加载出来，
         * 何时加载，初始化时
         * 从space表里查询是旗舰版的团队空间的id放到availableTargetNames中
         */
    }

    @Override
    public Collection<String> doSharding(Collection<String> collection, RangeShardingValue<Long> rangeShardingValue) {
        return new ArrayList<>();
    }

    @Override
    public Properties getProps() {
        return null;
    }

    @Override
    public void init(Properties properties) {

    }
}